package eSchool.DataLayer;

import eSchool.BL.Aluno;
import eSchool.BL.Alunos;
import eSchool.BL.CriteriosPesquisa;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.sql.RowSet;

public class AccessAlunoDAO implements IAlunoDAO {

    private Connection connection = null;

    public AccessAlunoDAO() {
    // initialization 
    }

    public int insertAluno(Aluno aluno) throws Exception {
        Connection con = connection;
        int resultado = -1;

        if (con == null) {
            con = AccessDAOFactory.createConnection();
        }

        String sqlIns = "Insert into aluno (numAluno, nomeAluno, moradaAluno, codPostalAluno, localidadeAluno, sexoAluno,emailAluno, telefoneAluno, obsAluno)";
        sqlIns += " values (?,?,?,?,?,?,?,?,?)";
        PreparedStatement pst = con.prepareStatement(sqlIns);
        pst.setString(1, aluno.getNumAluno());
        pst.setString(2, aluno.getNome());
        pst.setString(3, aluno.getMorada());
        pst.setString(4, aluno.getCodPostal());
        pst.setString(5, aluno.getLocalidade());
        pst.setString(6, String.valueOf(aluno.getSexo()));
        pst.setString(7, aluno.getEmail());
        pst.setString(8, aluno.getTelefone());
        pst.setString(9, aluno.getObs());

        resultado = pst.executeUpdate();

        if (connection == null) {
            con.close();
            con = null;
        }

        return resultado;
    }

    public boolean deleteAluno(Aluno aluno) {
        // Implement delete customer here
        // Return true on success, false on failure
        return true;
    }

    public Aluno findAluno(String numAluno) throws Exception {
        Aluno aluno = null;

        return findAluno(aluno, numAluno);
    }
    
    public Aluno findAluno(Aluno aluno, String numAluno) throws Exception {
        Connection con = connection;
        
        if (con == null) {
            con = AccessDAOFactory.createConnection();
        }

        String sqlSlct = " SELECT numAluno, nomeAluno, moradaAluno, codPostalAluno, localidadeAluno, sexoAluno, emailAluno, telefoneAluno, obsAluno " +
                         " FROM Aluno" +
                         " WHERE numAluno = ?";

        PreparedStatement pst = con.prepareStatement(sqlSlct);
        pst.setString(1, numAluno);

        ResultSet rs = pst.executeQuery();
        
        while (rs.next()) {
            aluno.setNumAluno(rs.getString("numAluno"));
            aluno.setNome(rs.getString("nomeAluno"));
            aluno.setMorada(rs.getString("moradaAluno"));
            aluno.setCodPostal(rs.getString("codPostalAluno"));
            aluno.setLocalidade(rs.getString("localidadeAluno"));           
            aluno.setSexo(rs.getString("sexoAluno"));
            aluno.setEmail(rs.getString("emailAluno"));
            aluno.setTelefone(rs.getString("telefoneAluno"));
            aluno.setObs(rs.getString("obsAluno"));
            
        }
        
        rs.close();
                
        if (connection == null) {
            con.close();
            con = null;
        }
        return aluno;
    }


    public boolean updateAluno(Aluno aluno) throws Exception {
        Connection con = connection;

        if (con == null) {
            con = AccessDAOFactory.createConnection();
        }

        String sqlUpd = " Update aluno SET  " +
                " nomeAluno = ?, " +
                " moradaAluno = ?, " +
                " codPostalAluno = ?, " +
                " localidadeAluno = ?, " +
                " sexoAluno = ?, " +
                " emailAluno = ?, " +
                " telefoneAluno = ?, " +
                " obsAluno = ? " +
                " WHERE numAluno = ?";

        PreparedStatement pst = con.prepareStatement(sqlUpd);
        pst.setString(1, aluno.getNome());
        pst.setString(2, aluno.getMorada());
        pst.setString(3, aluno.getCodPostal());
        pst.setString(4, aluno.getLocalidade()); 
        pst.setString(5, aluno.getSexo());
        pst.setString(6, aluno.getEmail());
        pst.setString(7, aluno.getTelefone());
        pst.setString(8, aluno.getObs());
        pst.setString(9, aluno.getNumAluno());
        
        pst.executeUpdate();

        if (connection == null) {
            con.close();
            con = null;
        }

        return true;
    }

    public RowSet selectAlunoRS(Aluno criterio) {
        // implement search customers here using the
        // supplied criteria.
        // Return a RowSet. 
        return null;
    }

    public Alunos selectAlunoTO(CriteriosPesquisa criterio) throws Exception {
        Alunos alunos= new Alunos();
        
        return selectAlunoTO(alunos, criterio);      
    }
    
    public Alunos selectAlunoTO(Alunos alunos, CriteriosPesquisa criterio) throws Exception {
      Connection con = connection;
        Aluno aluno = null;
        
        if (con == null) {
            con = AccessDAOFactory.createConnection();
        }

        String sqlSlct = " SELECT numAluno, nomeAluno, moradaAluno, codPostalAluno, localidadeAluno, sexoAluno, emailAluno, telefoneAluno, obsAluno " +
                         " FROM Aluno";

        PreparedStatement pst = con.prepareStatement(sqlSlct);
        
        ResultSet rs = pst.executeQuery();
        
        while (rs.next()) {
            aluno = new Aluno();
            aluno.setNumAluno(rs.getString("numAluno"));
            aluno.setNome(rs.getString("nomeAluno"));
            aluno.setMorada(rs.getString("moradaAluno"));
            aluno.setCodPostal(rs.getString("codPostalAluno"));
            aluno.setLocalidade(rs.getString("localidadeAluno"));
            aluno.setSexo(rs.getString("sexoAluno"));
            aluno.setEmail(rs.getString("emailAluno"));
            aluno.setTelefone(rs.getString("telefoneAluno"));            
            aluno.setObs(rs.getString("obsAluno"));            
            alunos.add(aluno);
        }
        
        rs.close();
                
        if (connection == null) {
            con.close();
            con = null;
        }
        
        return alunos;
    }

   
}
